#include "my_lllt.h"
#include "my_uart.h"
#include "sys_param.h"

//---------------------2024 08 13 check
// 20PCS, 仅红色灯珠
#define  LLLT_20PCS_SIGNAL_RED_PORT     (GPIOB)
#define  LLLT_20PCS_SIGNAL_RED_PIN      (GPIO_PIN_11)
#define  S_RED_20PCS_ON()               set_pin_high(LLLT_20PCS_SIGNAL_RED_PORT, LLLT_20PCS_SIGNAL_RED_PIN)
#define  S_RED_20PCS_OFF()              set_pin_low(LLLT_20PCS_SIGNAL_RED_PORT, LLLT_20PCS_SIGNAL_RED_PIN)


//20pcs, 红绿复合灯珠--红色控制脚
#define  LLLT_20PCS_DOUBLE_RED_PORT     (GPIOB)
#define  LLLT_20PCS_DOUBLE_RED_PIN      (GPIO_PIN_2)
#define  D_RED_20PCS_ON()               set_pin_high(LLLT_20PCS_DOUBLE_RED_PORT, LLLT_20PCS_DOUBLE_RED_PIN)
#define  D_RED_20PCS_OFF()              set_pin_low(LLLT_20PCS_DOUBLE_RED_PORT, LLLT_20PCS_DOUBLE_RED_PIN)

//20pcs, 红绿复合灯珠--绿色控制脚
#define  LLLT_20PCS_DOUBLE_GREEN_PORT   (GPIOA)
#define  LLLT_20PCS_DOUBLE_GREEN_PIN    (GPIO_PIN_11)
#define  D_GREEN_20PCS_ON()             set_pin_high(LLLT_20PCS_DOUBLE_GREEN_PORT, LLLT_20PCS_DOUBLE_GREEN_PIN)
#define  D_GREEN_20PCS_OFF()            set_pin_low(LLLT_20PCS_DOUBLE_GREEN_PORT, LLLT_20PCS_DOUBLE_GREEN_PIN)

//2PCS, 红外符合灯珠---红色控制（660nm）脚
#define  LLLT_2PCS_IR660NM_PORT         (GPIOC)
#define  LLLT_2PCS_IR660NM_PIN          (GPIO_PIN_14)
#define  D_IR_RED_660_2PCS_ON()         set_pin_high(LLLT_2PCS_IR660NM_PORT, LLLT_2PCS_IR660NM_PIN)
#define  D_IR_RED_660_2PCS_OFF()        set_pin_low(LLLT_2PCS_IR660NM_PORT, LLLT_2PCS_IR660NM_PIN)


//2PCS, 红外符合灯珠---红色控制（1064nm）脚
#define  LLLT_2PCS_IR1064NM_PORT        (GPIOC)
#define  LLLT_2PCS_IR1064NM_PIN         (GPIO_PIN_15)
#define  D_IR_RED_1064_2PCS_ON()        set_pin_high(LLLT_2PCS_IR1064NM_PORT, LLLT_2PCS_IR1064NM_PIN)
#define  D_IR_RED_1064_2PCS_OFF()       set_pin_low(LLLT_2PCS_IR1064NM_PORT, LLLT_2PCS_IR1064NM_PIN)


static void eye_mode_disp(void);
static void face_mode_disp(void);
static void body_mode_disp(void);
static void hair_mode_disp(void);
static void uart_test_mode_disp(void);
static void aling_mode_disp(void);
static void lift_mode_disp(void);

/*************
1.Ⅰ.EYE  眼部模式  ：（20颗）vcsel红灯660nm+近红外1064nm + （20颗）vcsel红灯660nm（暂不确定）
2. Ⅱ.FACE 脸部模式：（20颗）红灯660nm+近红外1064nm+（20颗）绿光540nm
3. Ⅲ.BODY 身体模式：（20颗）vcsel红灯660nm+（20颗）绿光540nm
4.  Ⅳ.HAIR 头皮模式 ：(20颗)vcsel红灯660nm + （20颗）vcsel红灯660nm（暂不确定）
* **/
typedef void(*disp_fun_t)(void);


typedef struct 
{
    WORK_MODE_e mode;
    disp_fun_t disp_func;

    /* data */
}LLLT_DISP_t;


LLLT_DISP_t lllt_disp_item[] = {
    {EYE_MODE, eye_mode_disp},
    {FACE_MODE, face_mode_disp},
    {BODY_MODE, body_mode_disp},
    {HAIR_MODE, hair_mode_disp},
    {UART_TEST_MODE, uart_test_mode_disp},
    {ALIGN_MODE, uart_test_mode_disp},
    {LIFT_MODE, uart_test_mode_disp},
};

/*************
1.Ⅰ.EYE  眼部模式  ：（20颗）vcsel红灯660nm+近红外1064nm + （20颗）vcsel红灯660nm（暂不确定）
* **/
static void eye_mode_disp(void)
{
    // D_GREEN_20PCS_OFF();
    // S_RED_20PCS_ON();
    // D_IR_RED_660_2PCS_ON();
    // D_IR_RED_1064_2PCS_ON();
    // D_RED_20PCS_ON();

    D_RED_20PCS_ON();
    D_GREEN_20PCS_ON();
    S_RED_20PCS_ON();
    D_IR_RED_660_2PCS_ON();
    D_IR_RED_1064_2PCS_ON();

}
/*************
2. Ⅱ.FACE 脸部模式：（20颗）红灯660nm+近红外1064nm+（20颗）绿光540nm
* **/
static void face_mode_disp(void)
{
    D_RED_20PCS_ON();
    D_GREEN_20PCS_ON();
    S_RED_20PCS_ON();
    D_IR_RED_660_2PCS_ON();
    D_IR_RED_1064_2PCS_ON();
}

/*************
3. Ⅲ.BODY 身体模式：（20颗）vcsel红灯660nm+（20颗）绿光540nm
* **/
static void body_mode_disp(void)
{
    D_RED_20PCS_OFF();
    D_GREEN_20PCS_ON();
    S_RED_20PCS_ON();
    D_IR_RED_660_2PCS_OFF();
    D_IR_RED_1064_2PCS_OFF();
}
/*************
4.  Ⅳ.HAIR 头皮模式 ：(20颗)vcsel红灯660nm + （20颗）vcsel红灯660nm（暂不确定）
* **/
static void hair_mode_disp(void)
{
    S_RED_20PCS_ON();
    D_RED_20PCS_ON();
    D_GREEN_20PCS_OFF();
    D_IR_RED_660_2PCS_OFF();
    D_IR_RED_1064_2PCS_OFF();
}
/*************
5. 测试模式, 假设10ms进入一次
***/
static void uart_test_mode_disp(void)
{
    static int flicker_cnt = 0;
    static int on_off_flag;

    flicker_cnt ++;
    if(on_off_flag){
        if(flicker_cnt > 50){
            flicker_cnt = 0;
            on_off_flag = 0;
            S_RED_20PCS_OFF();
            D_RED_20PCS_OFF();
            D_GREEN_20PCS_OFF();
            D_IR_RED_660_2PCS_OFF();
            D_IR_RED_1064_2PCS_OFF();
        }
    }
    else{
       if(flicker_cnt > 50){
            flicker_cnt = 0;
            on_off_flag = 1;
            S_RED_20PCS_ON();
            D_RED_20PCS_ON();
            D_GREEN_20PCS_ON();
            D_IR_RED_660_2PCS_ON();
            D_IR_RED_1064_2PCS_ON();
        }
    }
}
/*************
6. 老化测试
* **/
static void aling_mode_disp(void)
{
    uart_test_mode_disp();
}
/*************
7. 寿命测试
* **/
static void lift_mode_disp(void)
{
    uart_test_mode_disp();
}

/***************
 * 在系统 10ms中调用
 * 
*/
void my_lllt_disp(void)
{
    int index;
    int cur_model = get_sys_mode();
    static int last_disp_model = 0xff;
    
    for(index = 0; index < sizeof(lllt_disp_item)/sizeof(lllt_disp_item[0]); index++){
        if(cur_model == lllt_disp_item[index].mode){
            if(last_disp_model != cur_model){
                last_disp_model = cur_model;
                lllt_disp_item[index].disp_func();
                 printf("lllt_cur_model:[%d] \r\n", last_disp_model);
                break;
            }
        }
    }
}

void my_lllt_on(void)
{
    // set_pin_high(LLLT_GREEN_PORT, LLLT_GREEN_PIN);
    // set_pin_high(LLLT_RED1_PORT, LLLT_RED1_PIN);
    // set_pin_high(LLLT_RED2_PORT, LLLT_RED2_PIN);
}

void my_lllt_off(void)
{
    // set_pin_low(LLLT_GREEN_PORT, LLLT_GREEN_PIN);
    // set_pin_low(LLLT_RED1_PORT, LLLT_RED1_PIN);
    // set_pin_low(LLLT_RED2_PORT, LLLT_RED2_PIN);
}


void my_lllt_init(void)
{
	printf("\n\r UART_PRINT_EN:%d  LLLT_RED2_PIN:%d \n\r", UART_PRINT_EN, LLLT_20PCS_SIGNAL_RED_PIN);
	
    gpio_output_cfg(LLLT_20PCS_SIGNAL_RED_PORT, LLLT_20PCS_SIGNAL_RED_PIN);
    gpio_output_cfg(LLLT_20PCS_DOUBLE_RED_PORT, LLLT_20PCS_DOUBLE_RED_PIN);
    gpio_output_cfg(LLLT_20PCS_DOUBLE_GREEN_PORT, LLLT_20PCS_DOUBLE_GREEN_PIN);

    gpio_output_cfg(LLLT_2PCS_IR660NM_PORT, LLLT_2PCS_IR660NM_PIN);
    gpio_output_cfg(LLLT_2PCS_IR1064NM_PORT, LLLT_2PCS_IR1064NM_PIN);
}
